Skip to content

Add product guides for Grimoire 1.x - #207

Merged
goniszewski merged 9 commits into
developfrom
docs/product-guides
Aug 23, 2026
Merged

goniszewski merged 9 commits into
developfrom
docs/product-guides

Conversation

@goniszewski

Copy link
Copy Markdown
Owner

Summary

  • Add laconic product guides under docs/grimoire/ (intro, quick start, usage, development, native install, remote access, FAQ)
  • Point the README Documentation section at those guides and the live site at goniszewski.com/grimoire
  • Set package.json homepage to the published docs URL

Note

This branch is based on release-1.1.0, so the PR also includes the release commits not yet on main. The docs commit itself is docs-only.

Test plan

  • Review docs/grimoire/*.md for accuracy against implemented features
  • Confirm README Documentation links resolve
  • Confirm FAQ pointer and live-site link are correct

goniszewski and others added 7 commits August 3, 2026 11:32
* fix: patch release-blocking inconsistencies

- install.sh: default LITTLEIMP_VERSION to the current release (was 0.1.0-beta)
- extractors: accept www.github.com URLs, restore .git suffix stripping, and
  send Grimoire/1.0.0 User-Agent from all fetchers
- e2e: align mock daemon and specs with the real daemon version and repo URLs
- embedding-repository: rebuild the sqlite-vec index in a single atomic
  transaction instead of thousands of per-row transactions on every boot
- docs: refresh release-checklist.md and update-system.md version strings
  (0.1.0-beta -> 1.0.0) and align test fixtures

* chore(release): publish 1.0.1 patch

- Bump version identity to 1.0.1 across package manifests, install.sh,
  API/MCP contract, docs, e2e mocks, and test fixtures
- Derive the outgoing User-Agent from the packaged version instead of
  hardcoding it, so fetchers stop drifting from the release version
- Build release archives and fill the Homebrew formula and checksum
  baselines with the real 1.0.1 artifact SHAs
- Add a 1.0.1 changelog entry; regenerate API docs
* fix: patch release-blocking inconsistencies

- install.sh: default LITTLEIMP_VERSION to the current release (was 0.1.0-beta)
- extractors: accept www.github.com URLs, restore .git suffix stripping, and
  send Grimoire/1.0.0 User-Agent from all fetchers
- e2e: align mock daemon and specs with the real daemon version and repo URLs
- embedding-repository: rebuild the sqlite-vec index in a single atomic
  transaction instead of thousands of per-row transactions on every boot
- docs: refresh release-checklist.md and update-system.md version strings
  (0.1.0-beta -> 1.0.0) and align test fixtures

* chore(release): publish 1.0.1 patch

- Bump version identity to 1.0.1 across package manifests, install.sh,
  API/MCP contract, docs, e2e mocks, and test fixtures
- Derive the outgoing User-Agent from the packaged version instead of
  hardcoding it, so fetchers stop drifting from the release version
- Build release archives and fill the Homebrew formula and checksum
  baselines with the real 1.0.1 artifact SHAs
- Add a 1.0.1 changelog entry; regenerate API docs
- Bump version identity to 1.1.0 across package manifests, install.sh,
  API/MCP contract, docs, e2e mocks, and test fixtures
- Carry the 1.0.1 release-identity fixes onto the release branch: installer
  version default, Grimoire/<version> user-agents, www.github.com / .git
  handling, atomic sqlite-vec index rebuild
- Build 1.1.0 release archives and fill the Homebrew formula and checksum
  baselines with the real artifact SHAs
- Add a 1.1.0 changelog entry; regenerate API docs

Co-authored-by: Robert Goniszewski <robertgoniszewski@outlook.com>
Signed-off-by: Robert Goniszewski <robertgoniszewski@outlook.com>
Resolve all conflicts in favor of the 1.1.0 release branch (superset of
the 1.0.1 content cherry-picked earlier plus the 1.1.0 version bumps).

Co-authored-by: Robert Goniszewski <robertgoniszewski@outlook.com>
Signed-off-by: Robert Goniszewski <robertgoniszewski@outlook.com>
Signs release/*.tar.gz with a detached gpg signature (key auto-detected
from the repo git user.email), verifies, runs release:validate
--require-signatures, and exports the public key + fingerprint.

Co-authored-by: Robert Goniszewski <robertgoniszewski@outlook.com>
Signed-off-by: Robert Goniszewski <robertgoniszewski@outlook.com>
Keep in-repo Markdown under docs/grimoire for GitHub readers while the published site lives at goniszewski.com/grimoire.
Copilot AI lite review requested due to automatic review settings August 15, 2026 17:19
@cursor

cursor Bot commented Aug 15, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

馃挕 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ad64c269f8

鈩癸笍 About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 馃憤.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/pages/Index.tsx Outdated
Comment on lines +242 to +244
new Promise<void>((resolve, reject) => {
if (readLater) store.markReadLater(id, { onSuccess: () => resolve(), onError: () => reject(new Error("failed")) });
else store.clearReadLater(id, { onSuccess: () => resolve(), onError: () => reject(new Error("failed")) });

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Use mutateAsync for each bulk read-later update

When two or more bookmarks are selected, these promises wrap consecutive calls to the same updateBookmarkMutation.mutate and depend on its per-call callbacks. TanStack Query only retains the callbacks for the latest consecutive mutate call, so the earlier promises never settle and Promise.all never reaches either branch; the daemon updates may finish, but selection mode never exits and no result toast appears. Expose a mutateAsync-based operation or aggregate completion outside the shared mutation observer.

Useful? React with 馃憤聽/ 馃憥.

Comment thread src/pages/Index.tsx Outdated
});
toast({ title: `Moved ${selectedIds.size} bookmark${selectedIds.size !== 1 ? "s" : ""} to "${category}"` });
exitSelectionMode();
void Promise.all(ids.map((id) => store.deleteBookmark(id)))

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve undo for partial bulk-delete successes

If one delete request fails after other requests have succeeded, Promise.all rejects and skips the only branch that offers Undo. The successfully deleted bookmarks therefore remain in trash while the UI reports only that the bulk operation failed and keeps the stale selection active. Track individual results with Promise.allSettled or otherwise expose the successful subset so users can undo or accurately understand the partial deletion.

Useful? React with 馃憤聽/ 馃憥.

Comment thread daemon/src/update/upgrade.ts Outdated
Comment on lines +254 to +255
const bytes = new Uint8Array(await res.arrayBuffer());
if (bytes.byteLength > MAX_UPGRADE_ARTIFACT_BYTES) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Enforce the upgrade size cap while streaming

When an update server omits or understates Content-Length, arrayBuffer() buffers the complete archive before the byte-limit check runs. Because this occurs before checksum or signature verification, an attacker-controlled custom release endpoint鈥攐r a compromised upstream鈥攃an send an unbounded response and exhaust the CLI process's memory despite the advertised 512 MiB cap. Read and cancel the response stream once the running total exceeds the limit, as the page and model-catalog fetchers already do.

Useful? React with 馃憤聽/ 馃憥.

Use mutateAsync for bulk read-later, preserve undo on partial bulk deletes, and enforce upgrade artifact size limits while streaming.
@sonarqubecloud

Copy link
Copy Markdown

@goniszewski
goniszewski changed the base branch from main to develop August 15, 2026 19:33
@goniszewski goniszewski changed the title Add laconic product guides for Grimoire 1.x Add product guides for Grimoire 1.x Aug 23, 2026
@goniszewski
goniszewski merged commit 409a957 into develop Aug 23, 2026
7 checks passed
@goniszewski
goniszewski deleted the docs/product-guides branch August 23, 2026 12:47
goniszewski added a commit that referenced this pull request Aug 24, 2026
* fix(security): harden SSRF, upgrades, bind policy, and mutation UX

Address the comprehensive code-review findings: validate redirects before
following them, reject arbitrary HTTP update sources, require signed remote
upgrades, fail closed on non-loopback binds outside containers, reject URL
credentials consistently, apply default body limits, drop unsafe restore
bypass from HTTP, and make frontend mutations confirm before success UX.

Co-authored-by: Robert Goniszewski <goniszewski@users.noreply.github.com>

* test: align category filter expectations and simplify update check types

Prefer category_id-only list/search params in hook tests, and use a
concrete ApiUpdateCheckResult shape to avoid deep DTO instantiation.

Co-authored-by: Robert Goniszewski <goniszewski@users.noreply.github.com>

* fix(ui): keep Add Bookmark validation copy e2e-compatible

Preserve a "valid URL" phrase in the dialog error so existing journey
coverage continues to match the safer http(s)/no-credentials check.

Co-authored-by: Robert Goniszewski <goniszewski@users.noreply.github.com>

* feat(settings): add AI provider model catalog picker

- daemon: GET /settings/ai-models lists the OpenRouter model catalog with a
  free-only filter; guarded by the X-LittleImp-Frontend header, SSRF checks
  (private-host base URLs and redirect final hops), a 15s timeout, and a
  10 MB response cap; upstream error bodies are never relayed
- settings: default OpenRouter model becomes openai/gpt-latest (drop the
  confusing '~' fallback prefix); stored values are normalized on load
- frontend: searchable model combobox with free-only toggle, loading/error/
  retry states, and custom (typed) model entry
- contract, generated API docs, fixtures, and tests updated

Co-authored-by: Robert Goniszewski <robertgoniszewski@outlook.com>
Signed-off-by: Robert Goniszewski <robertgoniszewski@outlook.com>

* fix(security): keep private update sources working and align fetcher UA

- update/service: thread allowPrivateHosts into the real-fetch path so the
  CLI's local test sources (e.g. --source http://127.0.0.1:9999) are not
  blocked by the new per-hop redirect guard; private hosts stay rejected
  by default on the HTTP route
- pipeline/fetcher: send the current Grimoire/<version> user-agent (was the
  stale LittleImp/0.0 string pointing at the old little-imp repo URL)
- tests: cover private-source checkForUpdates behavior and the fetcher UA

Co-authored-by: Robert Goniszewski <robertgoniszewski@outlook.com>
Signed-off-by: Robert Goniszewski <robertgoniszewski@outlook.com>

* Add product guides for Grimoire 1.x (#207)

* feat(TASK-147): add static public demo mode

* fix: allow explicitly configured remote origins

* fix(TASK-147): polish public demo overlays and detail state

* fix(TASK-147): align demo E2E with v1.1 release baseline

* fix(release): restore installable v1.1 lockfile

* fix(TASK-147): configure automatic Sonar fixture exclusion

* chore(docs): clean up redundant documentation

* chore(docs): clean up redundant project artifacts

---------

Signed-off-by: Robert Goniszewski <robertgoniszewski@outlook.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Robert Goniszewski <goniszewski@users.noreply.github.com>
goniszewski added a commit that referenced this pull request Aug 24, 2026
* fix(security): harden SSRF, upgrades, bind policy, and mutation UX

Address the comprehensive code-review findings: validate redirects before
following them, reject arbitrary HTTP update sources, require signed remote
upgrades, fail closed on non-loopback binds outside containers, reject URL
credentials consistently, apply default body limits, drop unsafe restore
bypass from HTTP, and make frontend mutations confirm before success UX.

Co-authored-by: Robert Goniszewski <goniszewski@users.noreply.github.com>

* test: align category filter expectations and simplify update check types

Prefer category_id-only list/search params in hook tests, and use a
concrete ApiUpdateCheckResult shape to avoid deep DTO instantiation.

Co-authored-by: Robert Goniszewski <goniszewski@users.noreply.github.com>

* fix(ui): keep Add Bookmark validation copy e2e-compatible

Preserve a "valid URL" phrase in the dialog error so existing journey
coverage continues to match the safer http(s)/no-credentials check.

Co-authored-by: Robert Goniszewski <goniszewski@users.noreply.github.com>

* feat(settings): add AI provider model catalog picker

- daemon: GET /settings/ai-models lists the OpenRouter model catalog with a
  free-only filter; guarded by the X-LittleImp-Frontend header, SSRF checks
  (private-host base URLs and redirect final hops), a 15s timeout, and a
  10 MB response cap; upstream error bodies are never relayed
- settings: default OpenRouter model becomes openai/gpt-latest (drop the
  confusing '~' fallback prefix); stored values are normalized on load
- frontend: searchable model combobox with free-only toggle, loading/error/
  retry states, and custom (typed) model entry
- contract, generated API docs, fixtures, and tests updated

Co-authored-by: Robert Goniszewski <robertgoniszewski@outlook.com>
Signed-off-by: Robert Goniszewski <robertgoniszewski@outlook.com>

* fix(security): keep private update sources working and align fetcher UA

- update/service: thread allowPrivateHosts into the real-fetch path so the
  CLI's local test sources (e.g. --source http://127.0.0.1:9999) are not
  blocked by the new per-hop redirect guard; private hosts stay rejected
  by default on the HTTP route
- pipeline/fetcher: send the current Grimoire/<version> user-agent (was the
  stale LittleImp/0.0 string pointing at the old little-imp repo URL)
- tests: cover private-source checkForUpdates behavior and the fetcher UA

Co-authored-by: Robert Goniszewski <robertgoniszewski@outlook.com>
Signed-off-by: Robert Goniszewski <robertgoniszewski@outlook.com>

* Add product guides for Grimoire 1.x (#207)

* feat(TASK-146): add Grimoire v0.5 SQLite migration CLI and API

Ship inspect/apply (with dry-run) for v0.5 data dirs and archives, including owner selection, optional password verification, media safety checks, and docs/task report updates.

* feat(TASK-146): harden v0.5 migrate for non-destructive production use

Keep source DBs untouched via temp snapshots, refuse unsafe archives before extract, commit applies transactionally with locks and rollback-safe media cleanup, and preserve migrated content/FTS across reprocess.

* fix(TASK-146): harden legacy migration transaction safety

* fix(release): restore installable v1.1 lockfile

* chore(docs): clean up redundant documentation

* chore(docs): clean up redundant project artifacts

* fix(TASK-146): harden legacy migration and mark it experimental

---------

Signed-off-by: Robert Goniszewski <robertgoniszewski@outlook.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Robert Goniszewski <goniszewski@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants